package common

import (
	"strings"
	"time"
)

// TCPConfig ================= Tcp配置 =========================
type TCPConfig struct {
	IP      string        `json:"ip"`                // IP地址 (e.g. "192.168.1.10")
	Port    int           `json:"port"`              // 端口号 (e.g. 8080)
	Timeout time.Duration `json:"timeout,omitempty"` // 连接超时时间（可选）
}

// SerialConfig ================= 串口通信配置结构 =================
type SerialConfig struct {
	Port     string        `json:"port"`      // 串口号(COM1, /dev/ttyUSB0)
	BaudRate int           `json:"baud_rate"` // 波特率(9600, 115200)
	DataBits int           `json:"data_bits"` // 数据位(5,6,7,8)
	StopBits int           `json:"stop_bits"` // 停止位(1,2)
	Parity   ESerialParity `json:"parity"`    // 校验位(0:None,1:Odd,2:Even)
	Timeout  int           `json:"timeout"`   // 操作超时(ms)
}

// MQTTConfig ================= MQTT通信配置结构 =========================
type MQTTConfig struct {
	Broker    string `json:"broker"`     // 代理地址(tcp://host:port)
	ClientID  string `json:"client_id"`  // 客户端ID
	Qos       int    `json:"qos"`        // QoS等级(0,1,2)
	Username  string `json:"username"`   // 认证用户名
	Password  string `json:"password"`   // 认证密码
	KeepAlive int    `json:"keep_alive"` // 心跳间隔(秒)
}

// SAlarmRealTime ================= 实时告警 ==============================
type SAlarmRealTime struct {
	AlarmID     string    `json:"alarm_id"`     // 告警唯一ID（UUID）
	LinkIndex   string    `json:"device_index"` // 关联设备/参数索引
	AlarmType   int       `json:"alarm_type"`   // 告警类型（0:设备告警 1:参数告警）
	AlarmValue  string    `json:"alarm_value"`  // 触发告警的值
	AlarmLevel  int       `json:"alarm_level"`  // 告警等级（0:提示 1:警告 2:严重 3:紧急）
	Description string    `json:"description"`  // 告警描述
	StartTime   time.Time `json:"start_time"`   // 告警开始时间
	AlarmCount  int       `json:"count"`        // 告警计数
}

func MapDataType(xmlType string) EArgValueType {
	switch strings.ToLower(xmlType) {
	case "短整形", "short":
		return EArgTypeShort
	case "整形", "int":
		return EArgTypeInt
	case "浮点数", "float":
		return EArgTypeFloat
	case "字符串", "string":
		return EArgTypeString
	case "布尔", "bool":
		return EArgTypeBool
	case "字节", "bytes":
		return EArgTypeBytes
	case "长整形", "long":
		return EArgTypeInt
	default:
		return EArgTypeInt
	}
}

// 映射参数类型到枚举值
func MapParamType(xmlType string) EArgType {
	switch xmlType {
	case "设备参数":
		return EArgTypeDev // 设备参数
	case "默认值参数":
		return EArgTypeDefault // 默认值参数
	case "自定义参数":
		return EArgTypeCustum // 自定义参数
	default:
		return EArgTypeDev // 设备参数
	}
}

// 映射推送类型到枚举值
func MapTriggerType(trigger string) EArgPushType {
	switch trigger {
	case "不推送":
		return EPushNever // 变化时推送
	case "变化推送":
		return EPushOnChange // 定时推送
	case "定时推送":
		return EPushOnInterval // 立即触发视为变化触发
	case "变化或定时":
		return EPushOnChangeAndTime
	default:
		return 0 // 不推送
	}
}

// 映射推送类型到枚举值
func MapEnableType(hisen string) EEnAbleState {
	switch hisen {
	case "启用", "1":
		return Enable // 变化时推送
	case "禁用", "0":
		return Disable // 定时推送
	default:
		return Disable // 不推送
	}
}

func MapModbusType(regstr string) EModbusRegisterType {
	switch regstr {
	case "线圈":
		return EModbusRegisterCoil
	case "离散输入":
		return EModbusRegisterDiscreteInput
	case "输入寄存器":
		return EModbusRegisterInputRegister
	case "保持寄存器":
		return EModbusRegisterHolding
	default:
		return EModbusRegisterHolding
	}
}
